
#ifndef RQueue_t_h
#define RQueue_t_h

// Std includes.
#include <variant_map.h>
#include <variant_vector.h>

// CSharp includes.
#include <Typedef.h>
#include <Defines.h>

// Riccsson includes.
#include <System/Collections/Generic/IDictionary.h>
#include <System/Collections/Generic/ICollection.h>
#include <System/Collections/Generic/IEnumerable.h>
#include <System/Collections/Generic/KeyNotFoundException.h>
#include <System/IDisposable.h>
#include <System/ArgumentException.h>
#include <System/ArgumentNullException.h>
#include <System/IndexOutOfRangeException.h>
#include <System/ArgumentOutOfRangeException.h>
#include <System/Array.h>

namespace Riccsson
{
	namespace System
	{
		namespace Collections
		{
			namespace Generic
			{
				// Summary:
				//     Represents a first-in, first-out collection of objects.
				//
				// Type parameters:
				//   T:
				//     Specifies the type of elements in the queue.
				template<typename T> class Queue
					: public Riccsson::System::Collections::Generic::ICollection<T>
				{
					
					// Summary:
					//     Enumerates the elements of a System.Collections.Generic.Queue<T>.
					struct Enumerator
						: public Riccsson::System::Collections::Generic::IEnumerator<T>
					{

						// Summary:
						//     Gets the element at the current position of the enumerator.
						//
						// Returns:
						//     The element in the System.Collections.Generic.Queue<T> at the current position
						//     of the enumerator.
						//
						// Exceptions:
						//   System.InvalidOperationException:
						//     The enumerator is positioned before the first element of the collection or
						//     after the last element.
						public: PROP3_GET(T, Current)
						{
							throw;
						}

						// Summary:
						//     Releases all resources used by the System.Collections.Generic.Queue<T>.Enumerator.
						public: void Dispose()
						{
							throw;
						}
						//
						// Summary:
						//     Advances the enumerator to the next element of the System.Collections.Generic.Queue<T>.
						//
						// Returns:
						//     true if the enumerator was successfully advanced to the next element; false
						//     if the enumerator has passed the end of the collection.
						//
						// Exceptions:
						//   System.InvalidOperationException:
						//     The collection was modified after the enumerator was created.
						public: bool MoveNext()
						{
							throw;
						}
					};


					// Summary:
					//     Initializes a new instance of the System.Collections.Generic.Queue<T> class
					//     that is empty and has the default initial capacity.
					public: Queue()
					{
						throw;
					}

					//
					// Summary:
					//     Initializes a new instance of the System.Collections.Generic.Queue<T> class
					//     that contains elements copied from the specified collection and has sufficient
					//     capacity to accommodate the number of elements copied.
					//
					// Parameters:
					//   collection:
					//     The collection whose elements are copied to the new System.Collections.Generic.Queue<T>.
					//
					// Exceptions:
					//   System.ArgumentNullException:
					//     collection is null.
					public: Queue(IEnumerable<T>* collection)
					{
						throw;
					}

					//
					// Summary:
					//     Initializes a new instance of the System.Collections.Generic.Queue<T> class
					//     that is empty and has the specified initial capacity.
					//
					// Parameters:
					//   capacity:
					//     The initial number of elements that the System.Collections.Generic.Queue<T>
					//     can contain.
					//
					// Exceptions:
					//   System.ArgumentOutOfRangeException:
					//     capacity is less than zero.
					public: Queue(int capacity)
					{
						throw;
					}

					// Summary:
					//     Gets the number of elements contained in the System.Collections.Generic.Queue<T>.
					//
					// Returns:
					//     The number of elements contained in the System.Collections.Generic.Queue<T>.
					public: override PROP3_GET(int, Count)
					{
						throw;
					}

					public: override PROP3_GET(bool, IsReadOnly)
					{
						throw;
					}

					// Summary:
					//     Removes all objects from the System.Collections.Generic.Queue<T>.
					public: void Clear()
					{
						throw;
					}

					//
					// Summary:
					//     Determines whether an element is in the System.Collections.Generic.Queue<T>.
					//
					// Parameters:
					//   item:
					//     The object to locate in the System.Collections.Generic.Queue<T>. The value
					//     can be null for reference types.
					//
					// Returns:
					//     true if item is found in the System.Collections.Generic.Queue<T>; otherwise,
					//     false.
					public: bool Contains(const T& item)
					{
						throw;
					}

					//
					// Summary:
					//     Copies the System.Collections.Generic.Queue<T> elements to an existing one-dimensional
					//     System.Array, starting at the specified array index.
					//
					// Parameters:
					//   array:
					//     The one-dimensional System.Array that is the destination of the elements
					//     copied from System.Collections.Generic.Queue<T>. The System.Array must have
					//     zero-based indexing.
					//
					//   arrayIndex:
					//     The zero-based index in array at which copying begins.
					//
					// Exceptions:
					//   System.ArgumentNullException:
					//     array is null.
					//
					//   System.ArgumentOutOfRangeException:
					//     arrayIndex is less than zero.
					//
					//   System.ArgumentException:
					//     The number of elements in the source System.Collections.Generic.Queue<T>
					//     is greater than the available space from arrayIndex to the end of the destination
					//     array.
					public: void CopyTo(Array<T>* array, int arrayIndex)
					{
						throw;
					}
					//
					// Summary:
					//     Removes and returns the object at the beginning of the System.Collections.Generic.Queue<T>.
					//
					// Returns:
					//     The object that is removed from the beginning of the System.Collections.Generic.Queue<T>.
					//
					// Exceptions:
					//   System.InvalidOperationException:
					//     The System.Collections.Generic.Queue<T> is empty.
					public: T Dequeue()
					{
						throw;
					}

					//
					// Summary:
					//     Adds an object to the end of the System.Collections.Generic.Queue<T>.
					//
					// Parameters:
					//   item:
					//     The object to add to the System.Collections.Generic.Queue<T>. The value can
					//     be null for reference types.
					public: void Enqueue(const T& item)
					{
						throw;
					}

					//
					// Summary:
					//     Returns an enumerator that iterates through the System.Collections.Generic.Queue<T>.
					//
					// Returns:
					//     An System.Collections.Generic.Queue<T>.Enumerator for the System.Collections.Generic.Queue<T>.
					public: Enumerator* GetEnumerator()
					{
						throw;
					}

					//
					// Summary:
					//     Returns the object at the beginning of the System.Collections.Generic.Queue<T>
					//     without removing it.
					//
					// Returns:
					//     The object at the beginning of the System.Collections.Generic.Queue<T>.
					//
					// Exceptions:
					//   System.InvalidOperationException:
					//     The System.Collections.Generic.Queue<T> is empty.
					public: T Peek()
					{
						throw;
					}

					//
					// Summary:
					//     Copies the System.Collections.Generic.Queue<T> elements to a new array.
					//
					// Returns:
					//     A new array containing elements copied from the System.Collections.Generic.Queue<T>.
					public: GC_PTR<Array<T>> ToArray()
					{
						throw;
					}

					//
					// Summary:
					//     Sets the capacity to the actual number of elements in the System.Collections.Generic.Queue<T>,
					//     if that number is less than 90 percent of current capacity.
					public: void TrimExcess()
					{
						throw;
					}
							
					private: /*override*/ void Add(const T& item) {throw;}
					private: /*override*/ bool Remove(const T& item) {throw;}
				};
			}
		}
	}
}

#endif // DICTIONARY_H